package c07运行环境与常用类;

import java.io.UnsupportedEncodingException;

public class StringTest {

	private String s = "";

	public StringTest(String s) {
		this.s = s;
	}

	public static void main(String[] args) throws UnsupportedEncodingException {
		System.err.println("字符串常量相关");
		String s = "abcd";
		String str = "a" + "b" + "c" + "d";//编译期间就可以确定str的值，所以直接引用常量池的"abcd"，即与s相等！
		String sn = new String("abcd");//sn指向堆内存的字符串
		String sab = "ab";
		String scd = "cd";
		String sx = sab + scd;//sab和scd都是变量，所以编译期间无法确定sx的值，因此sx引用一个新的字符串！
		System.err.println(s == str);//true！
		System.err.println(s == sn);//false！
		System.err.println(s == sx);//false！
		System.err.println("intern方法");
		//intern方法首先去字符串池里找，如果发现与本字符串内容相同的直接返回；否则，将本字符串添加到池中，
		//并返回此对象的引用。所以虽然s!=sn，但是s.intern()==sn.intern()！
		System.err.println(s.intern() == sn.intern());//true！

		System.err.println("常用方法");
		str = str.concat("efg");//与+号等价
		System.err.println(s.compareTo(str));//如果前面的序列相同，则返回两个字符串的长度差
		System.err.println(s.compareTo(sn));//完全相同返回0
		System.err.println(s.compareTo(scd));//否则返回不相同的字符的差值
		StringBuffer sb = new StringBuffer(s);
		System.err.println(s.contentEquals(sb));//比较内容
		System.err.println(s.equals(sb));//false
		System.err.println(s.toUpperCase());//变大写返回
		System.err.println(s.charAt(0));//返回a！可见上面的方法不能影响原来的字符串！
		System.err.println(s.indexOf('b'));
		System.err.println(s.codePointAt(0));//返回指定下标处的字符Unicode码
		System.err.println(s.contains("f"));
		//除了replaceFirst方法是替换第一个匹配的字符串，其他带replace的方法都是替换所有匹配的东西
		System.err.println("1011011".replace("10", "x"));

		System.err.println("字符串与字符数组");
		char[] c0 = s.toCharArray();//字符串转数组
		System.err.println(String.copyValueOf(c0));//字符数组转字符串
		System.err.println(new String(c0));//效果同上
		str.getChars(1, 4, c0, 0);//字符串直接拿出一段到指定字符数组
		System.err.println(new String(c0));
		System.err.println(str.substring(1, 4));//注意两点：1.是substring而不是subString！2.包括下标1不包括4！

		System.err.println("字符串与字节数组");
		String szj = "周星驰吴孟达";
		byte[] b0 = szj.getBytes();//默认是UTF-8编码
		System.err.println(b0.length);//长度是18！采用的编码集不同长度就不同！
		byte[] b1 = szj.getBytes("GBK");
		System.err.println(b1.length);//采用GBK时是12！
		System.err.println(new String(b0, "UTF-8"));//正常显示
		System.err.println(new String(b0, "GBK"));//乱码！
		System.err.println(new String(b1, "UTF-8"));//乱码！
		System.err.println(new String(b1, "GBK"));//正常显示

		System.err.println("String重写的hashCode方法");
		String s1 = new String("s");
		String s2 = new String("s");
		//两者的hashCode相同！这是因为String内部重写了hashCode方法！
		System.err.println(s1.hashCode());
		System.err.println(s2.hashCode());
	}
}
